package com.jie.base;

import cn.hutool.json.JSONUtil;
import com.jie.base.repository.UserVisitCityRepository;
import com.jie.common.constant.RedisKey;
import com.jie.model.vo.base.CityVO;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.List;

/**
 * @author jie
 * @version 1.0 2025-02-15
 */
@SpringBootTest
public class BaseTestApplication {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void putHotCity() {
        // 准备测试数据
        List<CityVO> cities = List.of(
                CityVO.builder().id(1L).name("北京").code("BJS").build(),
                CityVO.builder().id(2L).name("上海").code("SHA").build(),
                CityVO.builder().id(3L).name("广州").code("CAN").build(),
                CityVO.builder().id(4L).name("深圳").code("SZX").build(),
                CityVO.builder().id(5L).name("成都").code("CTU").build(),
                CityVO.builder().id(6L).name("杭州").code("HGH").build(),
                CityVO.builder().id(7L).name("武汉").code("WUH").build(),
                CityVO.builder().id(8L).name("西安").code("SIA").build(),
                CityVO.builder().id(9L).name("重庆").code("CKG").build(),
                CityVO.builder().id(10L).name("南京").code("NKG").build()
        );

        String key = RedisKey.getRedisKey(RedisKey.HOT_CITY);
        // 添加城市数据，使用 sortOrder 作为分数
        double score = 0;
        cities.forEach(city -> {
            stringRedisTemplate.opsForZSet().add(key, JSONUtil.toJsonStr(city), score);
        }
        );
    }


    @Autowired
    private UserVisitCityRepository userVisitCityRepository;

    @Test
    public void testMongo() {
        // 模拟用户ID
        Long userId = 1001L;

        // 测试更新访问记录
        // 按顺序访问几个城市
        userVisitCityRepository.updateVisitCity(userId, 1L, "北京", "BJS");
        userVisitCityRepository.updateVisitCity(userId, 2L, "上海", "SHA");
        userVisitCityRepository.updateVisitCity(userId, 3L, "广州", "CAN");

        // 暂停一下，确保时间戳不同
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 重复访问一个城市，测试更新逻辑
        userVisitCityRepository.updateVisitCity(userId, 2L, "上海", "SHA");

        // 获取最近访问的城市列表
        List<CityVO> recentCities = userVisitCityRepository.getRecentCity(userId, 6);

        // 打印结果
        System.out.println("最近访问的城市列表：");
        recentCities.forEach(city ->
                System.out.println(String.format("城市ID: %d, 名称: %s, 代码: %s",
                        city.getId(),
                        city.getName(),
                        city.getCode())
                ));

        // 验证结果
        assert recentCities.size() > 0 : "应该有访问记录";
        assert recentCities.get(0).getId().equals(2L) : "最新访问的应该是上海";
        assert recentCities.get(1).getId().equals(3L) : "第二个应该是广州";
        assert recentCities.get(2).getId().equals(1L) : "第三个应该是北京";
    }
}
